package opencm;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.Validate;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;

public final class RepositorioConsulta implements Repositorio<Consulta> {

	private final List<Consulta> consultas = new ArrayList<Consulta>();
	
	@Override
	public void adicionarItens(List<Consulta> itens) {
		this.consultas.addAll(itens);
	}

	@Override
	public List<Consulta> getItens() {
		return new ArrayList<Consulta>(this.consultas);
	}
	
	public void adicionar(Consulta consulta) {
		Validate.isTrue(consulta.isAgendada(), "Você deve agendar a consulta antes de adiciona-la.");
		this.consultas.add(consulta);
	}
	
	public List<Consulta> pesquisarAgendadas() {
		ArrayList<Consulta> agendadas = new ArrayList<Consulta>();
		for (Consulta consulta : this.consultas) {
			if (!consulta.getAgendamento().isEmEspera()) {
				agendadas.add(consulta);
			}
		}
		return agendadas;
	}
	
	public List<Consulta> pesquisarListaDeEspera() {
		ArrayList<Consulta> espera = new ArrayList<Consulta>();
		for (Consulta consulta : this.consultas) {
			if (consulta.getAgendamento().isEmEspera()) {
				espera.add(consulta);
			}
		}
		return espera;
	}
	
	public List<Consulta> pesquisar(Medico medico, LocalDate data) {
		List<Consulta> consultas = new ArrayList<Consulta>();
		for (Consulta c : pesquisarAgendadas()) {
			Agendamento a = c.getAgendamento();
			if (a.getMedico().equals(medico) && a.getInicio().toLocalDate().equals(data)) {
				consultas.add(c);
			}
		}
		return consultas;
	}

	public List<Consulta> pesquisar(Medico medico, DateTime inicio, DateTime fim) {
		List<Consulta> consultas = new ArrayList<Consulta>();
		for (Consulta c : pesquisarAgendadas()) {
			Agendamento a = c.getAgendamento();
			if (a.getMedico().equals(medico) && a.getInicio().isAfter(inicio) && a.getInicio().isBefore(fim)) {
				consultas.add(c);
			}
		}
		return consultas;
	}
	
	public List<Consulta> pesquisarCirugias(Especialidade especialidade, LocalDate dataBase) {
		List<Consulta> cirugias = new ArrayList<Consulta>();
		for (Consulta c : pesquisarAgendadas()) {
			if (c.getTipo().equals(Consulta.Tipo.CIRUGIA)) {
				Agendamento a = c.getAgendamento();
				Medico m = a.getMedico();
				Especialidade e = m.getEspecialidade();
				if (e.equals(especialidade) && a.getInicio().toLocalDate().equals(dataBase)) {
					cirugias.add(c);
				}
			}
		}
		return cirugias;
	}

	public List<Consulta> pesquisar(Paciente paciente) {
		List<Consulta> consultas = new ArrayList<Consulta>();
		for (Consulta c : pesquisarAgendadas()) {
			if (c.getPaciente().equals(paciente)) {
				consultas.add(c);
			}
		}
		return consultas;
	}

	public boolean remover(Consulta consulta) {
		return consultas.remove(consulta);
	}
	
}
